#ifndef PROCESADOR_H_
#define PROCESADOR_H_

#include "ContenedorDeDefines.h"
#include "IfDefAnidados.h"
#include "FlagsDePrograma.h"
#include "Utilitarias.h"
#include "SeparadoresValidos.h"
#include "Precompilador.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class Procesador{
	
private:
	Precompilador precompilador;
	const char* rutaCarpetaConFuentes;
	
public:
	
	Procesador(const char* rutaCarpetaConFuentesAux) {
		rutaCarpetaConFuentes = rutaCarpetaConFuentesAux;
	}

	int esSeparadorValidoParaLaInstruccion(char* instr, char sep);
	int parseInstruccion(char* linea, FlagsDePrograma* flags,
			ContenedorDeDefines* lista, IfDefAnidados* anid,
			char* instr, int codInstr);

	void procesarInstruccion(char* linea, FlagsDePrograma* flags,
			ContenedorDeDefines* lista, IfDefAnidados* anid,
			int codInstr);

	void procesarIfdefOIfndef(char* linea, FlagsDePrograma* flags,
			ContenedorDeDefines* lista, IfDefAnidados* anid,
			int codInstr);

	void procesarInclude(char* linea, FlagsDePrograma* flags,
			ContenedorDeDefines* lista, IfDefAnidados* anid);

	void procesarElse(char* linea, IfDefAnidados* anid);
	void procesarEndif(char* linea, IfDefAnidados* anid);
	void procesarDefine(char* linea, FlagsDePrograma* flags,
			ContenedorDeDefines* lista);

	char* procesarDirectivaCompilador(char*, FlagsDePrograma*,
			ContenedorDeDefines*, IfDefAnidados*);
	void procesoLinea(char*, FlagsDePrograma*,
				ContenedorDeDefines*, IfDefAnidados*);
	void procesarDirectivaOBuscarReemplazos(char*, FlagsDePrograma*,
				ContenedorDeDefines*, IfDefAnidados*);
	void procesoArchivoEntrada(const char*, FlagsDePrograma*,
				ContenedorDeDefines*, IfDefAnidados*);
	int esDirectivaDeCompilador(char* linea);
};
#endif /* PROCESADOR_H_ */
